既存 VPC 内の EC2 インスタンスに Systems Manager セッションマネージャーで接続するためのエンドポイントだけを一発で作成するCloudFormationテンプレートを作った
コーヒーが好きな emi です。
普段は VPN や専用線(Direct Conect)経由で社内からプライベートサブネットの EC2 インスタンスにログインしているけど、一時的に Systems Manager セッションマネージャーで接続したい!
というケースがありました。Systems Manager(以降、SSM と省略)セッションマネージャーで EC2 インスタンスに接続するために、一時的に VPC エンドポイントだけを作成する CloudFormation テンプレートを作成しましたので、テンプレートと使い方を紹介します。
CloudFormation テンプレート
以下の CloudFormation テンプレートを yaml 形式で端末に保存しておきます。S3 や Git リポジトリに保存しても OK です。
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC endpoints for session manager
# ------------------------------------------------------------#
# Input Parameters
# -----------------------------------------------------------#
Parameters:
AvailabilityZone:
Type: AWS::EC2::AvailabilityZone::Name
Description: Select the Availability Zone to create the VPC endpoints in.
Default: ap-northeast-1a
VpcId:
Type: AWS::EC2::VPC::Id
Description: Select the VPC to create the VPC endpoints in.
Default: vpc-xxxxx
SubnetId:
Type: AWS::EC2::Subnet::Id
Description: Select the Subnet to create the VPC endpoints in.
Default: subnet-xxxxx
Ec2InstanceSg:
Type: AWS::EC2::SecurityGroup::Id
Description: Select the security group assigned to the EC2 instance.
Resources:
# ------------------------------------------------------------#
# Security group for VPC endpoints
# ------------------------------------------------------------#
VpcEndpointSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for VPC endpoints
VpcId: !Ref VpcId
Tags:
- Key: Name
Value: vpcep-sg
# Rule
SecurityGroupIngress:
- SourceSecurityGroupId: !Ref Ec2InstanceSg
IpProtocol: tcp
FromPort: 443
ToPort: 443
# ------------------------------------------------------------#
# VPC endpoints for session manager
# ------------------------------------------------------------#
SsmVpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref VpcEndpointSecurityGroup
ServiceName: com.amazonaws.ap-northeast-1.ssm
SubnetIds:
- !Ref SubnetId
VpcEndpointType: Interface
VpcId: !Ref VpcId
SsmMessagesVpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref VpcEndpointSecurityGroup
ServiceName: com.amazonaws.ap-northeast-1.ssmmessages
SubnetIds:
- !Ref SubnetId
VpcEndpointType: Interface
VpcId: !Ref VpcId
Ec2MessagesVpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref VpcEndpointSecurityGroup
ServiceName: com.amazonaws.ap-northeast-1.ec2messages
SubnetIds:
- !Ref SubnetId
VpcEndpointType: Interface
VpcId: !Ref VpcId
構成図とセキュリティグループの説明
この状態から、
CloudFormation テンプレートを展開するとこうなります。
Interface 型 VPC エンドポイント 3 つ(com.amazonaws.ap-northeast-1.ssm
、com.amazonaws.ap-northeast-1.ssmmessages
、com.amazonaws.ap-northeast-1.ec2messages
)と、VPC エンドポイント用のセキュリティグループが 1 つ作成されます。作成された Interface 型 VPC エンドポイント 3 つに、同じ VPC エンドポイント用のセキュリティグループが付与されます。
EC2 インスタンスにセッションマネージャー経由で接続できるようになります。
VPC エンドポイント用セキュリティグループでは EC2 用セキュリティグループからの HTTPS(ポート番号 443)通信を許可しています。
VPC エンドポイント用セキュリティグループ:vpcep-sg
セキュリティグループ | タイプ | プロトコル | ポート | 範囲 | 送信先 | 説明 |
---|---|---|---|---|---|---|
インバウンド | HTTPS | TCP | 443 | EC2 用セキュリティグループ | なし | |
アウトバウンド | すべてのトラフィック | すべて | すべて | 0.0.0.0/0 | なし |
ちなみに…
今回はアウトバウンド通信をすべて許可するセキュリテイグループを作成するのですが、セッションマネージャーでの接続には EC2 インスタンスから Systems Manager に向けて HTTPS(ポート番号 443)の通信が許可されていれば良いです。以下の図のようなイメージです。
使い方
CloudFormation コンソール画面で [スタックの作成] - [新しいリソース] をクリックします。
「テンプレートファイルのアップロード」より、CloudFormation テンプレートの yaml ファイルをアップロードします。S3 や Git リポジトリに保存した方はそちらからテンプレートを指定してください。
- スタック名
- 任意のスタック名を指定
- Ec2InstanceSg
- 接続したい EC2 インスタンスに付与されているセキュリティグループを選択
- SubnetId
- VPC エンドポイントを作成するサブネットを選択
- プライベートサブネットでもパブリックサブネットでも OK です
- EC2 インスタンスが通信可能なサブネットを選択してください
- VpcId
- VPC エンドポイントを作成する VPC を選択
上記パラメータを入力したら「次へ」をクリックします。
「スタックオプションの設定」画面では何もせず次へ進み、「確認して作成」画面で「送信」をクリックします。
スタックの状態が 1~2 分程度で「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」に変わります。
リソースタブを確認すると、Interface 型 VPC エンドポイント 3 つと、セキュリティグループ 1 つが作成されています。
EC2 コンソール画面でセキュリティグループを確認すると、「vpcep-sg」というセキュリティグループが作成されているのが分かります。
VPC コンソール画面でエンドポイントを確認すると、com.amazonaws.ap-northeast-1.ssm
、com.amazonaws.ap-northeast-1.ssmmessages
、com.amazonaws.ap-northeast-1.ec2messages
の 3 つのエンドポイントが作成されているのが分かります。
Systems Manager フリートマネージャーを確認すると、EC2 インスタンスの Ping ステータスがオンラインになっており、EC2 インスタンスにセッションマネージャー(もしくはフリートマネージャー)で接続できるようになっています。
準備完了です。EC2 インスタンスに接続して作業しましょう!
削除方法
接続して作業が終わったら、CloudFormation スタックを削除すればエンドポイント関連のリソースのみ削除されるので元通りです。
CloudFormation スタックの削除は、スタックを開いて「削除」をクリックすれば OK です。
スタックのステータスが「DELETE_COMPLET!E」になれば削除完了です。
時間を置くと、フリートマネージャーのステータスが「接続が失われました」となり、接続不可になります。
注意
- EC2 インスタンスから SSM への通信は可能になりますが、インターネット向けには通信できません。ソフトウェアのダウンロードなどが必要な場合は NAT Gateway の利用をご検討ください。
- EC2 インスタンスに SSM エージェントがインストールされていることが前提です。
- EC2 インスタンスに付与されているセキュリティグループのアウトバウンドで HTTPS(ポート番号 443)が解放されていない場合、SSM と通信できません。
- VPC の設定で DNS ホスト名が無効になっていると、VPC エンドポイント名が名前解決できず以下のようなエラーになり、通信できません。
VPC エンドポイントの作成中にエラーが発生しました
Enabling private DNS requires both enableDnsSupport and enableDnsHostnames VPC attributes set to true for vpc-xxxxx
NAT Gateway と VPC エンドポイントの料金計算比較
同じケースで NAT Gateway を作ってルートテーブルを編集するという手順でも接続可能です。
東京リージョンでの料金を以下に記載します。
リソース自体の料金の比較
NAT Gatewayあたりの料金 (USD/時) | 各 AZ の Interface 型 VPC エンドポイント 1 つあたりの料金 (USD/時間) |
---|---|
USD 0.062 | USD 0.014 |
セッションマネージャーのための Interface 型 VPC エンドポイントは 3 つ必要なので、構築したリソース自体の料金の比較であれば
- NAT Gateway:USD 0.062
- Interface 型 VPC エンドポイント:USD 0.042(= 0.014 * 3)
と、若干 VPC エンドポイントの方がお得です。
通信料金の比較
NAT Gateway の通信料
NAT Gateway 処理データ 1 GiB あたりの料金 (USD) |
---|
USD 0.062 |
Interface 型 VPC エンドポイントの通信料
Interface 型 VPC エンドポイント AWS リージョンで 1 か月に処理されるデータ | 処理データ 1 GiB あたりの料金 (USD)※ |
---|---|
最初の 1 PB | 0.01 USD |
次の 4 PB | 0.006 USD |
5 PB以上のもの | 0.004 USD |
※AWS リージョン内のすべてのインターフェイスエンドポイントが処理するデータの合計
処理データ 1 GiB あたりの料金は
- NAT Gateway:USD 0.062
- Interface 型 VPC エンドポイント:USD 0.03
と、これも VPC エンドポイントの方がお得です。
今回は一時的にセッションマネージャーで EC2 インスタンスに接続したい場合の試算です。
他にも AWS サービス向けに通信したいリソースが多くある場合、リソースの分だけ VPC エンドポイントの数が増えて管理が煩雑化し、料金が増える可能性があります。 その場合は NAT Gateway の方が管理コストが下がり料金も安くなる可能性があります。
参考
SSM Agent の更新や SSM Agent のインストールに必要な PRM ファイルのダウンロードが必要な場合、別途 Gateway 型 S3 エンドポイント(com.amazonaws.ap-northeast-1.s3
)が必要です。Gateway 型 S3 エンドポイントはセキュリティグループという概念がないので、エンドポイントポリシーで VPC 内の EC2 インスタンスからの接続が許可されていれば通信可能です。以下記事も参考にしてください。
終わりに
既に先人が誰か作っていそうな気がしましたが、検索でヒットしなかったのでブログにしました。一時作業などでお役に立てば幸いです。